/*
 * @Author: Sa 
 * @Date: 2018-09-16 09:19:58 
 * @Last Modified by: mikey.zhaopeng
 * @Last Modified time: 2018-10-13 09:49:50
 */

import axios from 'axios'
import config from '@/config/UserURLConfig'
import qs from 'qs'

//Global axios defaults
//axios.defaults.headers.post['Content-Type'] = 'application/json'
//axios.defaults.headers.get['Content-Type'] = 'application/json'
//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

/**
 * 在请求URL前面添加server
 */
function addServerUrl(url) {
  let server = config.server
  return server + url
}

export default {
  /**
   * 1.get请求
   * @param url ：请求的url
   * @param callBack ： 请求的回调函数
   * @param errorHandler ： 异常的回调函数
   */
  get: (url, callBack, errorHandler) => {
    axios
      .get(addServerUrl(url))
      .then(callBack)
      .catch(errorHandler)
  },

  /**
   * 2.post请求
   * @param url ：请求的url
   * @param data ： 请求的参数
   * @param callBack ： 回到函数
   * @param errorHandler ：异常的回调函数
   */
  post: (url, data, callBack, errorHandler) => {
    data = qs.stringify(data)
    axios
      .post(addServerUrl(url), data)
      .then(callBack)
      .catch(errorHandler)
  },

  /**
   * 3.文件上传的请求
   * @param url : 请求的Url
   * @param data ： 请求的数据
   * @param callBack ： 请求的回到函数
   * @param errorHandler ： 请求发生异常的回调函数
   */
  uploadFile: (url, data, callBack, errorHandler) => {
    axios
      .post(addServerUrl(url), data, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      })
      .then(callBack)
      .catch(errorHandler)
  },

  /**
   * 4.文件的下载
   * @param url : 请求的Url
   * @param data ： 请求的数据
   * @param errorHandler ： 请求发生异常的回调函数
   */
  loadLoadFile:(url, data, errorHandler) =>{
    axios.post(url,data,{
      headers :{
        responseType: 'blob'
      }
    }).then(res=>{
      const blob = new Blob([res.data])
      let url = window.URL.createObjectURL(blob)

      //创建一个a标签元素，设置下载属性，点击下载，最后移除该元素
      let link = document.createElement('a')
      link.href = url
      link.style.display = 'none'
      //res.headers.fileName 取出后台返回下载的文件名
      const downlaodFileName = decodeURIComponent(res.headers.filename)
      console.log(res.headers)
      link.setAttribute('download',downlaodFileName)
      link.click()
      window.URL.revokeObjectURL(url)
    }).catch(errorHandler)
  },

  /**
   * 通过XMLHttpRequest发送post请求下载文件
   *@param url : 请求的Url
   * @param data ： 请求的数据
   */
  XHRLoadLoadFile:(url, data)=>{
    let xhr = new XMLHttpRequest()
    xhr.open('post',url)
    xhr.setRequestHeader('Content-Type','application/json;charset=UTF-8')
    xhr.responseType = 'blob'
    xhr.send(JSON.stringify(data))
    xhr.onreadystatechange = function(){
      if(xhr.readyState ===4 && xhr.status === 200){
        const blob = new Blob([xhr.response])
        let url = window.URL.createObjectURL(blob)
  
        //创建一个a标签元素，设置下载属性，点击下载，最后移除该元素
        let link = document.createElement('a')
        link.href = url
        link.style.display = 'none'
        const fileName = xhr.getResponseHeader('filename')
        const downlaodFileName = decodeURIComponent(fileName)
  
        link.setAttribute('download',downlaodFileName)
        link.click()
        window.URL.revokeObjectURL(url)
      }
    }
  },


  request(param) {
    //dev env
    let serverPath = '/api'

    //pro env
    //let serverPath = 'http://www.choisaaaa.shop/api'
    return new Promise((resolve, rejects) => {
      axios({
        method: param.method || 'get',
        url: serverPath + param.url || '',
        headers: {
          'content-Type': 'application/x-www-form-urlencoded'
        },
        data: param.method=='post'? qs.stringify(param.data) : null
      })
        .then(res => {
          let data = {
            data : res.data.data || null,
            msg : res.data.msg || ''
          }
          
          if (0 === res.data.status) {
            
            typeof resolve === 'function' && resolve(data)
          }

          //前端输入的参数值有误
          else if (1 === res.data.status) {
            typeof rejects === 'function' && rejects(data)
          }

          //需要登录
          else if (10 === res.status) {
            // _this.doLogin()
          }

          //店家需要登录
          else if (11 === res.status) {
            //_this.doSellerLogin()
          }

          //后台发生了异常
          else if (-1 === res.status) {
            console.error(res.msg)
            res.msg = '我们的服务器不是很听话，它又淘气了！请稍后再试...'
            typeof param.error === 'function' && param.error(res)
          }

          //前端输入的参数有误
          else if (2 == res.status) {
            console.error(res.msg)
            res.msg = '抱歉！您输入的参数值不合法..'
            typeof param.error === 'function' && param.error(res)
          }
        })
        .catch(err => {
          typeof param.error === 'function' && param.error(err.statusText)
        })
    })
  }
}
